package com.google.gwt.sample.dynatablerf.server.domain;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;

import com.google.gwt.dev.util.collect.HashSet;

@Entity
@NamedQuery(name = Categoria.CATEGORIA_PESQUISAR, query = "SELECT p FROM Categoria p WHERE "
		+ "((:parent is null and p.parent is null) or (p.parent = :parent))")
public class Categoria extends AbstractEntity implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static final String CATEGORIA_PESQUISAR = "Categoria.pesquisar";

	private String nome;

	@ManyToOne
	private Categoria parent;

	@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
	private Set<Categoria> children;

	@OneToMany(cascade = CascadeType.ALL)
	private Set<Produto> produtoSet;

	public Categoria getParent() {
		return parent;
	}

	public void setParent(Categoria parent) {
		this.parent = parent;
	}

	public Set<Categoria> getChildren() {
		return children;
	}

	public void setChildren(Set<Categoria> children) {
		this.children = children;
	}

	public Set<Produto> getProdutoSet() {
		return produtoSet;
	}

	public void setProdutoSet(Set<Produto> produtoSet) {
		this.produtoSet = produtoSet;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public void addCategoria(Categoria categoria) {
		if (this.children == null)
			this.children = new HashSet<Categoria>();
		this.children.add(categoria);
		categoria.setParent(this);
	}

	public void addProduto(Produto produto) {
		if (this.produtoSet == null)
			this.produtoSet = new HashSet<Produto>();
		this.produtoSet.add(produto);
	}

}
